package 栈;

import com.alibaba.fastjson.JSON;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Stack;

public class No71简化路径 {

    /**
     * 以 Unix 风格给出一个文件的绝对路径，你需要简化它。或者换句话说，将其转换为规范路径。
     *
     * 在 Unix 风格的文件系统中，一个点（.）表示当前目录本身；此外，两个点 （..） 表示将目录切换到上一级（指向父目录）；两者都可以是复杂相对路径的组成部分。更多信息请参阅：Linux / Unix中的绝对路径 vs 相对路径
     *
     * 请注意，返回的规范路径必须始终以斜杠 / 开头，并且两个目录名之间必须只有一个斜杠 /。最后一个目录名（如果存在）不能以 / 结尾。此外，规范路径必须是表示绝对路径的最短字符串。
     *
     * 示例 1：
     * 输入："/home/"
     * 输出："/home"
     * 解释：注意，最后一个目录名后面没有斜杠。
     * 示例 2：
     * 输入："/../"
     * 输出："/"
     * 解释：从根目录向上一级是不可行的，因为根是你可以到达的最高级。
     * 示例 3：
     * 输入："/home//foo/"
     * 输出："/home/foo"
     * 解释：在规范路径中，多个连续斜杠需要用一个斜杠替换。
     * 示例 4：
     * 输入："/a/./b/../../c/"
     * 输出："/c"
     */

    public static String simplifyPath(String path) {
        /**
         * 一个个字符塞入栈不是解决方法,应该用split分割 '/'
         */
        return null;
    }

    public static String simplifyPathGood(String path) {
        System.out.println(JSON.toJSONString(path.split("/")));
        Stack<String> stack = new Stack<>();
        //分割后只剩下..(吐出一个字母)或者.(不管)或者字母(加入)
        for (String item : path.split("/")) {
            if (item.equals("..")) {
                if (!stack.isEmpty())
                    stack.pop();//吐出一个字母
            } else if (item.length()>0 && !item.equals(".")) {
                //吃入字母
                stack.add(item);
            }
        }
        StringBuilder stringBuilder=new StringBuilder("/");
        for (String str:stack) {//从开始遍历
            stringBuilder.append(str).append("/");
        }
        String string = stringBuilder.toString();
        string=string.substring(0,string.length()-1);
        if(string.length()==0)
            return "/";
        return string;
    }

    public static void main(String[] args) {
        System.out.println(simplifyPathGood("/a//b////c/d//././/.."));
    }

}
